"""💰 投资报告生成器 - 您的 AI 财经分析工作室！

这个高级示例展示了如何构建一个结合市场研究、财务分析和投资组合管理的复杂投资分析系统。
工作流采用三阶段方法：
1. 全面的股票分析与市场调研
2. 投资潜力评估与排名
3. 战略性资产配置建议

核心能力：
- 实时市场数据分析
- 专业财务研究
- 投资风险评估
- 投资组合配置策略
- 详细的投资逻辑说明

可分析的示例公司组合：
- "AAPL, MSFT, GOOGL"（科技巨头）
- "NVDA, AMD, INTC"（半导体领军企业）
- "TSLA, F, GM"（汽车创新）
- "JPM, BAC, GS"（银行业）
- "AMZN, WMT, TGT"（零售竞争）
- "PFE, JNJ, MRNA"（医疗健康）
- "XOM, CVX, BP"（能源板块）

运行 `pip install openai ddgs agno` 安装依赖。
"""

import asyncio
import random
from pathlib import Path
from shutil import rmtree
from textwrap import dedent

from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAIChat, OpenAILike
from agno.tools.baidusearch import BaiduSearchTools
# from agno.tools.duckduckgo import DuckDuckGoTools   # pip install ddgs
from agno.utils.pprint import pprint_run_response
from agno.workflow.types import WorkflowExecutionInput
from agno.workflow.workflow import Workflow
from pydantic import BaseModel
from configs.basic_config import ALI_GENERATION_MODEL, AGENT_URL, ALI_DASHSCOPE_API_KEY

# --- 响应模型 ---
class StockAnalysisResult(BaseModel):
    company_symbols: str
    market_analysis: str
    financial_metrics: str
    risk_assessment: str
    recommendations: str


class InvestmentRanking(BaseModel):
    ranked_companies: str
    investment_rationale: str
    risk_evaluation: str
    growth_potential: str


class PortfolioAllocation(BaseModel):
    allocation_strategy: str
    investment_thesis: str
    risk_management: str
    final_recommendations: str


# --- 文件管理 ---
reports_dir = Path(__file__).parent.joinpath("reports", "investment")
if reports_dir.is_dir():
    rmtree(path=reports_dir, ignore_errors=True)
reports_dir.mkdir(parents=True, exist_ok=True)

stock_analyst_report = str(reports_dir.joinpath("stock_analyst_report.md"))
research_analyst_report = str(reports_dir.joinpath("research_analyst_report.md"))
investment_report = str(reports_dir.joinpath("investment_report.md"))


# --- 智能体定义 ---
stock_analyst = Agent(
    name="股票分析师",
    model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY,
                     base_url=AGENT_URL),
    # model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY, base_url=AGENT_URL,
    #
    #                  "response_format": {"type": "json_object"},
    #                   "temperature": 0.1,
    #                     ),
    tools=[
        BaiduSearchTools(fixed_max_results=10,fixed_language="zh")
    ],
    description=dedent("""\
    你是金融行业资深投资分析师，专精于：

    - 全面的市场分析
    - 财务报表评估
    - 行业趋势识别
    - 新闻影响评估
    - 风险因素分析
    - 增长潜力评估\
    """),
    instructions=dedent("""\
    1. 市场研究 📊
       - 分析公司基本面与关键指标
       - 回顾近期市场表现
       - 评估竞争格局
       - 判断行业趋势与动态
    2. 财务分析 💹
       - 审查关键财务比率
       - 查阅分析师评级
       - 分析近期新闻影响
       - 识别增长催化剂
    3. 风险评估 🎯
       - 评估市场风险
       - 分析公司特有挑战
       - 考虑宏观经济因素
       - 识别潜在警示信号
    请严格按以下 JSON 格式输出，仅包含以下5个字段，不要任何额外内容、解释或 Markdown：

    {
      "company_symbols": str,
      "market_analysis": str,
      "financial_metrics": str,
      "risk_assessment": str,
      "recommendations": str
    }
    
    只输出纯 JSON，不要 ```json 包裹，不要前缀。
    """),
    output_schema=StockAnalysisResult,
    use_json_mode=True
)

research_analyst = Agent(
    name="研究分析师",
    model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY,
                     base_url=AGENT_URL),
    description=dedent("""\
    你是金融行业资深研究分析师，专注于：

    - 投资机会评估
    - 横向对比分析
    - 风险收益权衡
    - 增长潜力排序
    - 战略性建议制定\
    """),
    instructions=dedent("""\
    1. 投资分析 🔍
       - 评估每家公司的投资潜力
       - 对比相对估值水平
       - 评估竞争优势
       - 考察市场定位
    2. 风险评估 📈
       - 分析风险因素
       - 考虑市场环境
       - 评估增长可持续性
       - 评价管理层能力
    3. 公司排名 🏆
       - 按投资潜力排序
       - 提供详细理由
       - 考虑风险调整后回报
       - 阐明竞争优势
    请严格按以下 JSON 格式输出，仅包含以下4个字段，不要任何额外内容、解释或 Markdown：

    {
      "ranked_companies": str
      "investment_rationale": str
      "risk_evaluation": str
      "growth_potential": str
    }
    
    只输出纯 JSON，不要 ```json 包裹，不要前缀。
    """),
    output_schema=InvestmentRanking,
    use_json_mode=True,
)

investment_lead = Agent(
    name="投资主管",
    model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY, base_url=AGENT_URL),
    description=dedent("""\
    你是 PortfolioSage-X，金融行业资深投资主管，擅长：

    - 投资组合策略制定
    - 资产配置优化
    - 风险管理
    - 投资逻辑阐述
    - 客户建议呈现\
    """),
    instructions=dedent("""\
    1. 投资组合策略 💼
       - 制定资产配置方案
       - 优化风险收益平衡
       - 考虑分散化原则
       - 设定投资时间框架
    2. 投资逻辑 📝
       - 解释配置决策依据
       - 引用分析结果支撑
       - 回应潜在担忧
       - 突出增长催化剂
    3. 建议呈现 📊
       - 明确分配比例
       - 阐述投资主题
       - 提供可操作见解
       - 包含风险考量
    请严格按以下 JSON 格式输出，仅包含以下4个字段，不要任何额外内容、解释或 Markdown：

    {
      "allocation_strategy": str
      "investment_thesis": str
      "risk_management": str
      "final_recommendations": str
    }
    
    只输出纯 JSON，不要 ```json 包裹，不要前缀。
    """),
    output_schema=PortfolioAllocation,
    use_json_mode=True,
)


# --- 执行函数 ---
async def investment_analysis_execution(
    execution_input: WorkflowExecutionInput,
    companies: str,
) -> str:
    """执行完整的投资分析工作流"""

    # 获取输入
    message: str = execution_input.input
    company_symbols: str = companies

    if not company_symbols:
        return "❌ 未提供公司股票代码"

    print(f"🚀 开始对以下公司进行投资分析：{company_symbols}")
    print(f"💼 分析请求：{message}")

    # 第一阶段：股票分析
    print("\n📊 第一阶段：全面股票分析")
    print("=" * 60)

    analysis_prompt = f"""
    {message}

    请对以下公司进行全面分析：{company_symbols}

    对每家公司，请提供：
    1. 当前市场地位与财务指标
    2. 近期表现与分析师评级
    3. 行业趋势与竞争格局
    4. 风险因素与增长潜力
    5. 新闻影响与市场情绪
    待分析公司：{company_symbols}
    """

    print("🔍 正在分析市场数据与基本面……")
    stock_analysis_result = await stock_analyst.arun(analysis_prompt)
    print("stock_analysis_result:")
    print(stock_analysis_result)
    stock_analysis = stock_analysis_result.content
    print("stock_analysis: ")
    print(stock_analysis)

    # 保存到文件
    with open(stock_analyst_report, "w") as f:
        f.write("# 股票分析报告\n\n")
        f.write(f"**分析公司：** {stock_analysis.company_symbols}\n\n")
        f.write(f"## 市场分析\n{stock_analysis.market_analysis}\n\n")
        f.write(f"## 财务指标\n{stock_analysis.financial_metrics}\n\n")
        f.write(f"## 风险评估\n{stock_analysis.risk_assessment}\n\n")
        f.write(f"## 初步建议\n{stock_analysis.recommendations}\n")

    print(f"✅ 股票分析完成，已保存至 {stock_analyst_report}")

    # 第二阶段：投资潜力排名
    print("\n🏆 第二阶段：投资潜力排名")
    print("=" * 60)

    ranking_prompt = f"""
    基于以下股票分析结果，请按投资潜力对公司进行排名。
    股票分析内容：
    - 市场分析：{stock_analysis.market_analysis}
    - 财务指标：{stock_analysis.financial_metrics}
    - 风险评估：{stock_analysis.risk_assessment}
    - 初步建议：{stock_analysis.recommendations}
    请提供：
    1. 从最优到最差的投资潜力排名
    2. 每家公司的投资逻辑
    3. 风险评估与缓释策略
    4. 增长潜力判断
    """

    print("📈 正在按投资潜力对公司进行排名……")
    ranking_result = await research_analyst.arun(ranking_prompt)
    ranking_analysis = ranking_result.content

    # 保存到文件
    with open(research_analyst_report, "w") as f:
        f.write("# 投资潜力排名报告\n\n")
        f.write(f"## 公司排名\n{ranking_analysis.ranked_companies}\n\n")
        f.write(f"## 投资逻辑\n{ranking_analysis.investment_rationale}\n\n")
        f.write(f"## 风险评估\n{ranking_analysis.risk_evaluation}\n\n")
        f.write(f"## 增长潜力\n{ranking_analysis.growth_potential}\n")

    print(f"✅ 投资排名完成，已保存至 {research_analyst_report}")

    # 第三阶段：投资组合配置策略
    print("\n💼 第三阶段：投资组合配置策略")
    print("=" * 60)

    portfolio_prompt = f"""
    基于以下投资排名与分析，请制定战略性资产配置方案。
    投资排名内容：
    - 公司排名：{ranking_analysis.ranked_companies}
    - 投资逻辑：{ranking_analysis.investment_rationale}
    - 风险评估：{ranking_analysis.risk_evaluation}
    - 增长潜力：{ranking_analysis.growth_potential}
    请提供：
    1. 每家公司的具体配置比例（百分比）
    2. 投资主题与战略依据
    3. 风险管理方法
    4. 最终可执行建议
    """

    print("💰 正在制定投资组合配置策略……")
    portfolio_result = await investment_lead.arun(portfolio_prompt)
    portfolio_strategy = portfolio_result.content

    # 保存到文件
    with open(investment_report, "w") as f:
        f.write("# 投资组合配置报告\n\n")
        f.write(f"## 配置策略\n{portfolio_strategy.allocation_strategy}\n\n")
        f.write(f"## 投资主题\n{portfolio_strategy.investment_thesis}\n\n")
        f.write(f"## 风险管理\n{portfolio_strategy.risk_management}\n\n")
        f.write(
            f"## 最终建议\n{portfolio_strategy.final_recommendations}\n"
        )

    print(f"✅ 投资组合策略完成，已保存至 {investment_report}")

    # 最终摘要
    summary = f"""
    🎉 投资分析工作流已完成！

    📊 分析摘要：
    • 分析公司：{company_symbols}
    • 市场分析：✅ 已完成
    • 投资排名：✅ 已完成
    • 组合策略：✅ 已完成

    📁 生成报告：
    • 股票分析：{stock_analyst_report}
    • 投资排名：{research_analyst_report}
    • 组合策略：{investment_report}

    💡 核心洞察：
    {portfolio_strategy.allocation_strategy[:200]}...

    ⚠️ 免责声明：本分析仅供教育用途，不构成任何投资建议。
    """

    return summary


# --- 工作流定义 ---
investment_workflow = Workflow(
    name="投资报告生成器",
    description="自动化投资分析，包含市场研究与资产配置建议",
    # db=SqliteDb(
    #     session_table="workflow_session",
    #     db_file="tmp/workflows.db",
    # ),
    steps=investment_analysis_execution,
    session_state={},  # 初始化空的工作流会话状态
)


if __name__ == "__main__":

    async def main():
        from rich.prompt import Prompt

        # 示例投资场景，展示分析器能力
        example_scenarios = [
            "苹果, 微软, 谷歌",  # 科技巨头
            "英伟达, 超威半导体（AMD）, 英特尔",  # 半导体领军企业
            "特斯拉, 福特, 通用汽车",  # 汽车创新
            "摩根大通, 美国银行, 高盛",  # 银行业
            "亚马逊, 沃尔玛, 塔吉特",  # 零售竞争
            "辉瑞, 强生, 莫德纳",  # 医疗健康
            "埃克森美孚, 雪佛龙, 英国石油（BP）",  # 能源板块
        ]

        # 用户输入公司代码（支持默认推荐）
        companies = Prompt.ask(
            "[bold]请输入公司名（逗号分隔）[/bold]\n"
            "（直接回车将使用推荐组合）\n✨",
            default=random.choice(example_scenarios),
        )

        print("🧪 使用工作流结构测试x投资报告生成器")
        print("=" * 70)

        result = await investment_workflow.arun(
            input="生成全面的投资分析与资产配置建议",
            companies=companies,
        )

        pprint_run_response(result, markdown=True)

    asyncio.run(main())